home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / misc / amag / sh9302a.lha / Quevedo (S.45) / Quevedo.mod < prev    next >
Text File  |  1993-08-05  |  5KB  |  199 lines

  1. (****************************************************
  2.  
  3. Programm  : Quevedo.mod
  4. Zweck     : Schachendspiel Turm und König gegen König
  5. Version   : 2.0 / 5-8-93
  6. Autor     : Niels Knoop
  7. Copyright : Public Domain
  8. Sprache   : Oberon-2
  9. Compiler  : Amiga Oberon 3.0
  10.  
  11. ****************************************************)
  12.  
  13. MODULE Quevedo;
  14.  
  15. IMPORT QuevedoRoutinen,io;
  16.  
  17. VAR zuege : INTEGER;
  18.     altpos,neupos : QuevedoRoutinen.stellung;
  19.     zeichenkette : ARRAY 255 OF CHAR;
  20.     abbruch : BOOLEAN;
  21.  
  22. PROCEDURE LesePosition(VAR x,y : INTEGER) : BOOLEAN;
  23. (* Richtung (per Zahlenblock) oder Zielfeld einlesen *)
  24. VAR eingabe : ARRAY 100 OF CHAR;
  25.     n : INTEGER;
  26. BEGIN
  27.   io.ReadString(eingabe);
  28.   IF eingabe[1] # CHR(0) THEN
  29.     x := ORD(CAP(eingabe[0])) - 64;
  30.     y := ORD(CAP(eingabe[1])) - 48
  31.   ELSE
  32.     n := ORD(eingabe[0]) - 48;
  33.     IF (n >= 1) & (n <= 9) THEN
  34.       x := x + (n - 1) MOD 3 - 1;
  35.       y := y + (n - 1) DIV 3 - 1
  36.     END
  37.   END;
  38.   RETURN (CAP(eingabe[0]) = "Q")
  39. END LesePosition;
  40.  
  41.  
  42. PROCEDURE SchreibePosition(x,y : INTEGER);
  43. (* Feldkoordinaten im Klartext ausgeben *)
  44. BEGIN
  45.   io.Write(CHR(x + 96));
  46.   io.Write(CHR(y + 48))
  47. END SchreibePosition;
  48.  
  49.  
  50. PROCEDURE GotoXY(x,y : INTEGER);
  51. (* Cursor im Console-Fenster setzen *)
  52. VAR sequenz : ARRAY 10 OF CHAR;
  53. BEGIN
  54.   sequenz := "\[00;00H";
  55.   sequenz[1] := CHR((y DIV 10) MOD 10 + 48);
  56.   sequenz[2] := CHR(y MOD 10 + 48);
  57.   sequenz[4] := CHR((x DIV 10) MOD 10 + 48);
  58.   sequenz[5] := CHR(x MOD 10 + 48);
  59.   io.WriteString(sequenz);
  60. END GotoXY;
  61.  
  62.  
  63. PROCEDURE Brettmalen;
  64. (* Schachbrett auf den Bildschirm zeichnen *)
  65. VAR i,j,k : INTEGER;
  66.     schwarz,weiss,leer : ARRAY 5 OF CHAR;
  67. BEGIN
  68.   schwarz := "\[41m";
  69.   weiss := "\[42m";
  70.   leer := "\[40m";
  71.   io.WriteString("\[0m\f \r");  (* sic! *)
  72.   FOR i := 8 TO 1 BY -1 DO
  73.     FOR j := 1 TO 3 DO
  74.       GotoXY(1, 25 - 3 * i + j);
  75.       io.WriteString("   ");
  76.       FOR k := 1 TO 8 DO
  77.         IF (i MOD 2 = k MOD 2) THEN
  78.           io.WriteString(schwarz);
  79.         ELSE
  80.           io.WriteString(weiss);
  81.         END;
  82.         io.WriteString("     ")
  83.       END;
  84.       io.WriteString(leer);
  85.     END;
  86.   END;
  87.   FOR i := 8 TO 1 BY -1 DO
  88.     GotoXY(2, 27 - 3 * i);
  89.     io.Write(CHR(i + 48))
  90.   END;
  91.   FOR i := 1 TO 8 DO
  92.     GotoXY(5 * i + 1, 27);
  93.     io.Write(CHR(i + 64))
  94.   END
  95. END Brettmalen;
  96.  
  97.  
  98. PROCEDURE BeschreibeFeld(x,y,farbe : INTEGER; zeichen : CHAR);
  99. (* Angegebenes Feld auf dem Bildschirm beschreiben oder löschen *)
  100. VAR sequenz : ARRAY 25 OF CHAR;
  101. BEGIN
  102.   sequenz := "\[30m\[43m \[1m \[22m \[0m";
  103.   IF (farbe >= 0) THEN
  104.     sequenz[2] := CHR(farbe MOD 4 + 48);
  105.     sequenz[6] := "3";
  106.     sequenz[12]:= zeichen
  107.   ELSE
  108.     sequenz[6] := CHR((x + y) MOD 2 + 49)
  109.   END;
  110.   GotoXY(5 * x, 27 - 3 * y);
  111.   io.WriteString(sequenz)
  112. END BeschreibeFeld;
  113.  
  114.  
  115. BEGIN
  116. io.Clear;
  117. io.WriteString("   QUEVEDO 2.0 - Schachendspiel\n");
  118. io.WriteString("    Turm und König gegen König\n");
  119. io.WriteString("(benötigt ca. 80x30 Zeichen Platz)\n");
  120. io.WriteString("==================================\n");
  121. io.WriteString("Bitte die Anfangsstellung eingeben\n");
  122. io.WriteString("(z.B. Weiß: Th8 Ka1, Schwarz: Kd5)\n\n");
  123. LOOP
  124.   io.WriteString("Weiß   : T");
  125.   abbruch := LesePosition(altpos.wtx,altpos.wty);
  126.   io.WriteString("         K");
  127.   abbruch := LesePosition(altpos.wkx,altpos.wky);
  128.   io.WriteString("Schwarz: K");
  129.   abbruch := LesePosition(altpos.skx,altpos.sky);
  130.   IF QuevedoRoutinen.LegaleStellung(altpos) THEN
  131.     EXIT
  132.   END;
  133.   io.WriteString("\nSorry, illegale Stellung !\n\n")
  134. END;
  135. io.WriteLn;
  136. Brettmalen;
  137. BeschreibeFeld(altpos.wtx,altpos.wty,2,"T");
  138. BeschreibeFeld(altpos.wkx,altpos.wky,2,"K");
  139. BeschreibeFeld(altpos.skx,altpos.sky,1,"K");
  140. abbruch := FALSE;
  141. zuege := 1;
  142. neupos := altpos;
  143. REPEAT
  144.   QuevedoRoutinen.WeisserZug(neupos);
  145.   GotoXY(49,zuege + 1);
  146.   io.WriteInt(zuege,2);
  147.   io.WriteString(".  ");
  148.   IF neupos.turmzug THEN
  149.     io.Write("T");
  150.     SchreibePosition(altpos.wtx,altpos.wty);
  151.     io.Write("-");
  152.     SchreibePosition(neupos.wtx,neupos.wty);
  153.     BeschreibeFeld(altpos.wtx,altpos.wty,-1," ");
  154.     BeschreibeFeld(neupos.wtx,neupos.wty,2,"T")
  155.   ELSE
  156.     io.Write("K");
  157.     SchreibePosition(altpos.wkx,altpos.wky);
  158.     io.Write("-");
  159.     SchreibePosition(neupos.wkx,neupos.wky);
  160.     BeschreibeFeld(altpos.wkx,altpos.wky,-1," ");
  161.     BeschreibeFeld(neupos.wkx,neupos.wky,2,"K")
  162.   END;
  163.   IF neupos.schach THEN
  164.     GotoXY(60,zuege + 1);
  165.     io.Write("+")
  166.   END;
  167.   IF ~neupos.matt THEN
  168.     GotoXY(62,zuege + 1);
  169.     io.Write("K");
  170.     SchreibePosition(altpos.skx,altpos.sky);
  171.     io.Write("-");
  172.     REPEAT
  173.       neupos.skx := altpos.skx;
  174.       neupos.sky := altpos.sky;
  175.       GotoXY(66,zuege + 1);
  176.       abbruch := LesePosition(neupos.skx,neupos.sky);
  177.       GotoXY(66,zuege + 1);
  178.       io.WriteString("\[K")
  179.     UNTIL abbruch OR QuevedoRoutinen.LegaleStellung(neupos) &
  180.           ((neupos.skx # altpos.skx) OR (neupos.sky # altpos.sky)) &
  181.           (ABS(neupos.skx - altpos.skx) <= 1) &
  182.           (ABS(neupos.sky - altpos.sky) <= 1);
  183.     IF ~abbruch THEN
  184.       BeschreibeFeld(altpos.skx,altpos.sky,-1," ");
  185.       BeschreibeFeld(neupos.skx,neupos.sky,1,"K");
  186.       GotoXY(66,zuege + 1);
  187.       SchreibePosition(neupos.skx,neupos.sky)
  188.     END
  189.   ELSE
  190.     io.Write("+")
  191.   END;
  192.   altpos := neupos;
  193.   INC(zuege)
  194. UNTIL neupos.matt OR abbruch;
  195. GotoXY(1,28);
  196. io.closeDelay := 250
  197. END Quevedo.
  198.  
  199.